// Decompiled by DJ v3.11.11.95 Copyright 2009 Atanas Neshkov  Date: 22/03/2011 12:23:44 p.m.
// Home Page: http://members.fortunecity.com/neshkov/dj.html  http://www.neshkov.com/dj.html - Check often for new version!
// Decompiler options: packimports(3) 
// Source File Name:   PedidoDetFormModel.java

package com.luxsoft.sw3.impap.ui.form;

import ca.odell.glazedlists.*;
import ca.odell.glazedlists.matchers.Matchers;
import com.jgoodies.validation.ValidationResult;
import com.jgoodies.validation.util.PropertyValidationSupport;
import com.luxsoft.siipap.inventarios.dao.ExistenciaDao;
import com.luxsoft.siipap.inventarios.model.Existencia;
import com.luxsoft.siipap.model.Configuracion;
import com.luxsoft.siipap.model.Sucursal;
import com.luxsoft.siipap.model.core.Producto;
import com.luxsoft.siipap.model.core.Unidad;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.swing.controls.Header;
import com.luxsoft.siipap.swing.form2.DefaultFormModel;
import com.luxsoft.sw3.ventas.PedidoDet;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.math.BigDecimal;
import java.text.MessageFormat;
import java.util.*;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;

public class PedidoDetFormModel extends DefaultFormModel
    implements PropertyChangeListener
{

    public PedidoDetFormModel(PedidoDet bean)
    {
        super(bean);
        credito = false;
        fecha = new Date();
    }

    protected void init()
    {
        existencias = new BasicEventList(0);
        ca.odell.glazedlists.matchers.Matcher matcher = Matchers.beanPropertyMatcher(Existencia.class, "sucursal.habilitada", Boolean.TRUE);
        existencias = new FilterList(existencias, matcher);
        Comparator c2 = GlazedLists.beanPropertyComparator(Existencia.class, "sucursal.clave", new String[0]);
        existencias = new SortedList(existencias, GlazedLists.chainComparators(new Comparator[] {
            c2
        }));
        addBeanPropertyChangeListener(this);
        setSucursal(ServiceLocator2.getConfiguracion().getSucursal());
        setFecha(ServiceLocator2.obtenerFechaDelSistema());
        if(getProductio() != null)
            actualizarExistencias();
    }

    protected void addValidation(PropertyValidationSupport support)
    {
        if(getPedidoDet().getCantidad() == 0.0D)
            support.getResult().addError("La cantidad no puede ser 0");
    }

    public void dispose()
    {
        removeBeanPropertyChangeListener(this);
    }

    protected Producto getProductio()
    {
        return (Producto)getValue("producto");
    }

    protected PedidoDet getPedidoDet()
    {
        return (PedidoDet)getBaseBean();
    }

    private void actualizarPrecio()
    {
        double precio = getProductio().getPrecioContado();
        if(isCredito())
            precio = getProductio().getPrecioCredito();
        setValue("precio", BigDecimal.valueOf(precio));
    }

    private void actualizarMedidasDeCorte()
    {
    }

    protected void actualizarExistencias()
    {
        existencias.clear();
        existencias.addAll(ServiceLocator2.getExistenciaDao().buscarExistencias(getPedidoDet().getProducto(), getFecha()));
        existenciaTotal = 0.0D;
        for(Iterator iterator = existencias.iterator(); iterator.hasNext();)
        {
            Existencia e = (Existencia)iterator.next();
            existenciaTotal += e.getCantidad();
        }

    }

    public EventList getExistencias()
    {
        return existencias;
    }

    public double getExistencia()
    {
        Existencia res = (Existencia)CollectionUtils.find(getExistencias(), new Predicate() {

            public boolean evaluate(Object object)
            {
                Existencia exis = (Existencia)object;
                return exis.getSucursal().equals(getSucursal());
            }

            
        }
);
        double exi = res == null ? 0.0D : res.getDisponible();
        return exi;
    }

    public boolean isCredito()
    {
        return credito;
    }

    public void setCredito(boolean credito)
    {
        this.credito = credito;
    }

    public void updateHeader()
    {
        if(header != null)
        {
            Producto p = getProductio();
            if(p != null)
            {
                header.setTitulo(MessageFormat.format("{0} ({1})", new Object[] {
                    p.getDescripcion(), p.getClave()
                }));
                String pattern = "Uni:{0}\t Ancho:{1}\tLargo:{2}\t Calibre:{3}\nAcabado:{4}\t Caras:{5}\tPrecio:{6}\nCr\351dito: {7,number,currency}\tContado: {8,number,currency} \n\nExistencias     Sucursal:{9,number,#,###,###}   Total: {10,number,#,###,###}";
                String desc = MessageFormat.format(pattern, new Object[] {
                    p.getUnidad().getNombre(), Double.valueOf(p.getAncho()), Double.valueOf(p.getLargo()), Integer.valueOf(p.getCalibre()), p.getAcabado(), Integer.valueOf(p.getCaras()), p.getModoDeVenta() == null ? "" : p.getModoDeVenta().equals("B") ? "Bruto" : "Neto", Double.valueOf(p.getPrecioCredito()), Double.valueOf(p.getPrecioContado()), Double.valueOf(getExistencia()), 
                    Double.valueOf(existenciaTotal)
                });
                header.setDescripcion(desc);
            } else
            {
                header.setTitulo("Seleccione un producto");
                header.setDescripcion("");
            }
        }
    }

    public void propertyChange(PropertyChangeEvent evt)
    {
        if(evt.getPropertyName().equals("producto"))
        {
            actualizarExistencias();
            actualizarPrecio();
            updateHeader();
        } else
        if("cantidad".equals(evt.getPropertyName()))
            getPedidoDet().actualizar();
        else
        if("corteLargo".equals(evt.getPropertyName()))
            actualizarMedidasDeCorte();
        else
        if("corteAncho".equals(evt.getPropertyName()))
            actualizarMedidasDeCorte();
        else
        if("cortes".equals(evt.getPropertyName()))
            getPedidoDet().actualizar();
        else
        if("precioCorte".equals(evt.getPropertyName()))
            getPedidoDet().actualizar();
    }

    public Sucursal getSucursal()
    {
        return sucursal;
    }

    public void setSucursal(Sucursal sucursal)
    {
        this.sucursal = sucursal;
    }

    public Date getFecha()
    {
        return fecha;
    }

    public void setFecha(Date fecha)
    {
        this.fecha = fecha;
    }

    public Header getHeader()
    {
        if(header == null)
        {
            header = new Header("Seleccione un producto", "");
            header.setDescRows(5);
            updateHeader();
        }
        return header;
    }

    private EventList existencias;
    private Sucursal sucursal;
    private boolean credito;
    private Date fecha;
    private Header header;
    private double existenciaTotal;
}
